Laravel 模型的关联查询 & Debugbar 调试器 & 模型的预加载 ⑩② 您所在的位置:网站首页 laravel 模型关联查询 Laravel 模型的关联查询 & Debugbar 调试器 & 模型的预加载 ⑩②

Laravel 模型的关联查询 & Debugbar 调试器 & 模型的预加载 ⑩②

2023-10-25 04:32| 来源: 网络整理| 查看: 265

请添加图片描述

@作者 : SYFStrive

  请添加图片描述

@博客首页 : HomePage 📜: THINK PHP 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 👉:专栏连接🔗 请添加图片描述 相关专栏

👉 VUEJS(🔥) 👉 MYSQL(🔥) 👉 微信小程序(🔥) 👉 PHPMYSQL(🔥) 👉 UNIAPP开发(🔥)

目录 PHP LARAVEL 简介PHP LARAVEL 模型的关联查询   关联查询PHP LARAVEL Debugbar 调试器   安装使用PHP LARAVEL 模型的预加载   预加载最后

⡖⠒⠒⠒⠤⢄⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸ ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀ ⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀ ⠀⠙⣌⠳⣄⠀⡇ 不能 ⡏⠀⠀ ⠈⠳⡌⣦⠀⠀⠀⠀ ⠀⠀⠈⢳⣈⣻⡇ 白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀ ⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀ ⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀ ⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀ ⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀ ⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀ ⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀ ⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽

提示:以下是本篇文章正文内容

PHP LARAVEL 简介 Laravel是一种流行的开源PHP Web应用程序框架,由Taylor Otwell在2011年创建并发布。它提供了一个简洁优雅的语法和丰富的功能集,旨在使Web开发过程更快速、简单和愉悦。

MVC架构模式:Laravel采用了MVC(Model-View-Controller)架构模,将应用程序的逻辑分为不同的层,提高了代码的可维护性和可测试性。

简洁的语法和表达力:Laravel框架支持具有简洁而表达力的语法,使得编写清晰、易读、易维护的代码成为可能。

路由系统:它提供了一个强大且灵活的路由系统,通过简单的配置和代码即可定义Web应用程序的路由规则,实现URL到控制器的映射。

数据库抽象层:Laravel提供了一个简便的数据库抽象层,支持多种数据库系统,并通过Eloquent ORM提供了一种优雅的方法来与数据库进行交互。

权限和认证系统:Laravel提供了内置的身份验证和授权功能,使得实现用户身份验证、访问控制和权限管理变得简单和便捷。

缓存系统:Laravel支持多种缓存后端,包括文件、数据库、Memcached和Redis等,让你可以轻松地实现缓存数据,提升应用程序的性能。

强大的扩展性:Laravel通过Composer和Packagist等工具提供了丰富的扩展包生态系统,可以快速集成各种功能组件和第三方库,加快开发进程。

测试支持:Laravel鼓励编写和运行测试,提供了一套丰富的测试工具和断言,帮助开发者确保代码的质量和可靠性。

总的来说,Laravel框架以其易用性、优雅的语法、丰富的功能和强大的扩展性受到了广大开发者的喜爱。它提供了 PHP LARAVEL 模型的关联查询    关联查询

1 . 了解更多的查询方案;

//下面两种查询是一样的; $books = User::find(19)->book; $books = User::find(19)->book()->get(); //可以采用 where 筛选或闭包 $books = User::find(19)->book() ->where('id', 1)->orWhere('id', 11)->get(); $books = User::find(10)->book()->where(function ($query) { $query->where('id', 1)->orWhere('id', 11); })->get(); 使用 has()方法,可以查询某些条件下的关联查询数据; //获取存在关联书籍的用户列表(言下之意:至少一本书) $users = User::has('book')->get(); return $users; //获取存在关联书籍(并超过 3 条)的用户列表 $users = User::has('book','>=', 3)->get(); return $users; 使用 whereHas()方法,创建闭包查询; //whereHas 闭包用法 $users = User::whereHas('book', function ($query) { //这里$query 是 book 表,通过 user_id 查询,返回 user 表数据 $query->where('user_id', 19); })->get(); return $users; 使用 doesntHave()方法,即 has()的反向操作; //获取不存在关联书籍的用户列表,闭包用法:whereDoesntHave() $users = User::doesntHave('book')->get(); return $users; 使用 withCount()方法,可以进行关联统计; //关联统计,会自动给一个 book_count 字段 //统计每个用户有多少本书 $users = User::withCount('book')->get(); return $users; //给多个关系添加统计:profile_count,book_count $users = User::withCount(['profile', 'book'])->get(); return $users; //关联统计再结合闭包进行筛选,还可以设置别名 $users = User::withCount(['profile', 'book' => function ($query) { //这里限制被统计的记录 $query->where('user_id', 19); }])->get(); return $users; PHP LARAVEL Debugbar 调试器    安装使用 通过 composer 在项目中安装 Debugbar,命令如下:

安装调用器 👉 composer require barryvdh/laravel-debugbar

生成一个配置文件,给用户配置,可以根据需求进行配置;

php artisan vendor:publish --provider=“Barryvdh\Debugbar\ServiceProvider”

刷新页面,即可看到底部的调试工具,message 信息还需要引入; use Barryvdh\Debugbar\Facade as DebugBar; DebugBar::info('信息!'); 如果想要关闭调试工具,可以设置 config/debugbar.php; 'enabled' => env('DEBUGBAR_ENABLED', false), //手工 开启 或 关闭 DebugBar::enable(); DebugBar::disable();

图示 👇

在这里插入图片描述

PHP LARAVEL 模型的预加载    预加载 预加载,就是解决关联查询中产生的 N+1 次查询带来的资源消耗我们要获取所有书籍的作者 (或拥有者),普通查询方案如下: //获取所有书籍列表 $books = Book::all(); //遍历每一本书 foreach ($books as $book) { //每一本书的关联用户的姓名 DebugBar::info($book->user->username); } PS:通过调试器 Debugbar 中 SQL 语句的分析,发现包含十多条 SQL 语句; PS:原因是关联查询时,每遍历一次就会执行一遍 SQL 语句,导致性能欠佳; PS:所谓 N+1 条,就是起初获取全部数据的 1 条和,遍历的 N 条; 使用 with()关键字,进行预载入设置,提前将 SQL 整合; //with 关键字预载入 $books = Book::with('user')->get(); foreach ($books as $book) { DebugBar::info($book->user->username); } PS:此时的 SQL 执行数目为:1+1 条;也支持数组多个关联 with['book','prifile']; PS:预加载也可以设置显示的列; //预载入设置指定的列 $books = Book::with('user:id,username')->get(); 如果每次都必须使用预载入进行关联查询,可以在模型中定义; protected $with = ['user']; PS:此时就可以像最初那样写代码,而不需要使用 with()方法了; 为了演示方便,暂时取消模型$with,再看下预载入结合筛选; $books = Book::with(['user' => function ($query) { $query->where('id', 19); }])->get(); PS:预载入筛选不可以使用 limit、take 方法; 有时,可能会产生逻辑判断是否查询数据,但预加载会提前关联执行;这样,会导致资源性能的浪费,这时,可以采用延迟预载入; $books = Book::all(); if (true) { $books = $books->load('user'); //load(['user' => function () {}]) foreach ($books as $book) { DebugBar::info($book->user->username); } } 使用 loadCount()方法,可以实现延迟关联统计; $users = User::all(); if (true) { return $users->loadCount('book'); } 最后

以上是个人学习 THINKPHP 的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有